// 定义购物车 store相关逻辑

import { defineStore } from "pinia";
import { computed, ref } from "vue";
import { useUserStore } from "./userStore";
import { addCartAPI,getCartListAPI,deleteCartAPI } from "@/apis/cart";
import { ElMessage } from "element-plus";

export const useCartStore = defineStore('cart',()=>{
  // 获取token 判断用户是否登录了
  const userStore = useUserStore()
  const isLogin = computed(()=> userStore.userInfo.token)
  // 1 定义一个list存储商品列表 cartList
  const cartList = ref([])
  // 从接口获取购物车列表数据覆盖本地数据
  const updateCartList = async ()=>{
    // 2 获取最新购物车列表接口
    const res = await getCartListAPI()
    // 3 使用接口数据覆盖本地数据
    cartList.value = res.result
  }
  // 2 定义一个添加商品的方法 addCart
  const addCart = async (goods)=>{
    // 判断用户是否登录，如果登录了就调用接口，否则就走本地
    if(isLogin.value){
      // 走接口
      const data = {skuId:goods.skuId,count:goods.count}
      // 1 添加购物车接口
      await addCartAPI(data)
      // // 2 获取最新购物车列表接口
      // const res = await getCartListAPI()
      // // 3 使用接口数据覆盖本地数据
      // cartList.value = res.result
      await updateCartList()
    }else{
      // 走本地
      // 添加购物车操作
      // 分两步，1 在商品列表中没有找到该商品则添加，如果找到了就吧数量加一
      const item = cartList.value.find(item=>item.skuId==goods.skuId)
      if(item){
        //找到了
        item.count=goods.count
      }else{
        cartList.value.push(goods)
      }
    }
    ElMessage.success('添加购物车成功')
  }

  // 3 删除购物车中的商品
  const delCart = async (skuId)=>{
    if(isLogin.value){
      // 走接口
      // 1 调用删除接口
      await deleteCartAPI([skuId])
      // // 2 获取最新购物车列表接口
      // const res = await getCartListAPI()
      // // 3 使用接口数据覆盖本地数据
      // cartList.value = res.result
      await updateCartList()
    }else{
      // 走本地

      // 思路：
      // 1 根据skuId找到商品在数据中的下标 然后删除 findIndex
      // 2 使用 filter 函数过滤
      // const index = cartList.value.findIndex(item=>skuId===item.skuId)
      // cartList.value.splice(index,1)
      cartList.value = cartList.value.filter(item=>item.skuId!==skuId)
    }
  }
  // 计算属性
  // 1 总数量：所有商品的数量之和
  const allCount =computed(()=> cartList.value.reduce((a,c)=>a+=c.count,0))
  // 2 总价钱：所有商品的数量乘以单价之和
  const allPrice =computed(()=> cartList.value.reduce((a,c)=>a+=c.count*c.price,0))

  // 单选框选择功能
  const singleCheck = (skuId,selected) =>{
    const item = cartList.value.find(item=>item.skuId===skuId)
    item.selected = selected
  }
  // 全选事件
  const checkAll=(selected)=>{
    cartList.value.forEach(item=>item.selected = selected)
  }
  // 全选功能
  const isAll = computed(()=>cartList.value.every(item=>item.selected),0)
  // 已选择的商品数量
  const allSelectedCount = computed(()=>cartList.value.filter(i=>i.selected).reduce((a,c)=>a+=c.count,0))
  // 已选择商品的总价钱
  const allSelectedPrice = computed(()=>cartList.value.filter(i=>i.selected).reduce((a,c)=>a+=c.count*c.price,0))

  // 用户退出登录清除购物车功能
  const clearCart = ()=>{
    cartList.value=[]
  }
  // 返回
  return {
    cartList,addCart,delCart,allCount,allPrice,singleCheck,allSelectedCount,allSelectedPrice,isAll,checkAll,clearCart,updateCartList
  }
},{
  persist:true
})